Web-based services such as websites and web-based application programming interfaces may operate on a front-end component, such as a web server, that is connected to various back-end components such as databases, other web services, application servers, and so on. In some cases, these components may in turn call additional components. As a result, a failure in a web-based service may occur in a variety of locations, including within a component that is separated by a number of degrees from the front-end component.
A traditional approach to website testing is done using a browser, and by clicking on various links or buttons to see if the response returned by the website is the one that is expected. This may be done manually or using tools that automated the testing. However, failures involving nested components are often difficult to debug, and furthermore are often difficult to test. One approach to testing this type of failure involves simulating the failure of a back-end component. Typically, debugging code is included in a test version of the system and used to simulate the failure. The debugging code often requires configuration and may be excluded from production versions of the system, which limits the usefulness of this approach. In addition, this approach is even more difficult to apply to testing a variety of different behaviors, particularly those involving back-end components such as databases.